package com.mongodb.config;

import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoConverter;

import javax.annotation.Resource;

/**
 * 配置MongoTemplate以定制MongoDB操作行为
 * 该类实现ApplicationListener接口以监听ContextRefreshedEvent事件，即应用上下文刷新事件
 */
@Configuration
public class MongoConfig implements ApplicationListener<ContextRefreshedEvent> {

    /**
     * 注入MongoTemplate实例，用于MongoDB的数据访问
     */
    @Resource
    MongoTemplate oneMongoTemplate;

    /**
     * 定义类型键，用于标识MongoDB中文档的类类型
     */
    private static final String TYPEKEY = "_class";

    /**
     * 监听ContextRefreshedEvent事件，即应用上下文刷新时执行定制配置
     *
     * @param contextRefreshedEvent 上下文刷新事件，包含应用上下文信息
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        // 获取MongoTemplate的转换器，用于处理Java对象和MongoDB文档之间的转换
        MongoConverter converter = oneMongoTemplate.getConverter();
        // 检查当前转换器的类型映射是否使用指定的类型键
        if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
            // 如果是，则设置新的类型映射器，移除类型键，避免在文档中显示类信息
            ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
        }
    }
}


